package ar.frba.utn.diseñosistemas.Tests.TP2;

import java.util.ArrayList;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import ar.frba.utn.diseñosistemas.TP2.Aerolinea;
import ar.frba.utn.diseñosistemas.TP2.AerolineaMock;
import ar.frba.utn.diseñosistemas.TP2.AterrizarSingleton;
import ar.frba.utn.diseñosistemas.TP2.Asiento;
import ar.frba.utn.diseñosistemas.TP2.BuscadorBuilder;
import ar.frba.utn.diseñosistemas.TP2.Busqueda;
import ar.frba.utn.diseñosistemas.TP2.Clase;
import ar.frba.utn.diseñosistemas.TP2.IBuscador;
import ar.frba.utn.diseñosistemas.TP2.Itinerario;
import ar.frba.utn.diseñosistemas.TP2.Ubicacion;

public class TestBuscador {

	IBuscador buscadorNormal;
	IBuscador buscadorConRecargo;
	IBuscador buscadorSinSuperOferta;
	IBuscador buscadorConFiltroPorClase;
	IBuscador buscadorConFiltroPorUbicacion;
	
	Busqueda busquedaNormal;
	Busqueda busquedaConClaseTurista;
	Busqueda busquedaConUbicacionPasillo;
	Busqueda busquedaNormalConEscalas;
	
	int recargo = 0;
	
	@Before
	public void setUp() throws Exception {
		
		recargo = 100;
		
		busquedaNormal = new Busqueda("BS", "LA", "02-11-2012", null, null, null, null, null, null, 0);
		busquedaConClaseTurista = new Busqueda("BS", "NY", "02-11-2012",new Clase[] { Clase.Turista }, null, null, null, null, null, 0);
		busquedaConUbicacionPasillo = new Busqueda("BS", "LA", "02-11-2012", null, Ubicacion.Pasillo, null, null, null, null, 0);
		busquedaNormalConEscalas = new Busqueda("EZE", "USA", "02-11-2012", null, null, null, null, null, null, 2);
		
		ArrayList<Aerolinea> mocks = new ArrayList<Aerolinea>();
		mocks.add(new AerolineaMock());
		AterrizarSingleton.getInstance().setAerolineas(mocks);
		
		buscadorNormal = new BuscadorBuilder()
						  	 .Construir();
		
		buscadorConRecargo = new BuscadorBuilder()
							     .agregarRecargo(recargo)
							     .Construir();
		
		buscadorSinSuperOferta = new BuscadorBuilder()
								   	 .excluirSuperOfertas()
								     .Construir();
		
		buscadorConFiltroPorClase = new BuscadorBuilder()
									    .conFiltroPorClase()
									    .Construir();
		
		buscadorConFiltroPorUbicacion = new BuscadorBuilder()
										    .conFiltroPorUbicacion()
										    .Construir();
		
	}

	@Test
	public void buscarAsientosConRecargo() {
		
		ArrayList<Itinerario> itinerariosNormales = buscadorNormal.Buscar(busquedaNormal);
		ArrayList<Itinerario> itinerariosConRecargo = buscadorConRecargo.Buscar(busquedaNormal);
		for (int j = 0; j < itinerariosNormales.size(); j++) {
			for (int i = 0; i < itinerariosNormales.get(j).getAsientos().size(); i++) {
				Assert.assertEquals(itinerariosNormales.get(j).getAsientos().get(i).getPrecio(), itinerariosConRecargo.get(j).getAsientos().get(i).getPrecio() - recargo, 1);
			}
		}
	}
	
	
	@Test
	public void buscarAsientosSinSuperOfertas()
	{
		ArrayList<Itinerario> itinerarios = buscadorSinSuperOferta.Buscar(busquedaNormal);
		for (Itinerario itinerario : itinerarios){
			for (Asiento asiento : itinerario.getAsientos()) {
				Assert.assertFalse(asiento.esSuperOferta());
			}
		}
	}
	
	@Test
	public void buscarAsientosPorPrimeraClase()
	{
		ArrayList<Itinerario> itinerarios = buscadorConFiltroPorClase.Buscar(busquedaConClaseTurista);
		
		for (Itinerario itinerario : itinerarios){
			for (Asiento asiento : itinerario.getAsientos()) {
				Assert.assertEquals(asiento.getClase(), Clase.Turista);
			}
		}
	}

	@Test
	public void buscarAsientosPorUbicacionPasillo()
	{
		ArrayList<Itinerario> itinerarios = buscadorConFiltroPorUbicacion.Buscar(busquedaConUbicacionPasillo);
		
		for (Itinerario itinerario : itinerarios){
			for (Asiento asiento : itinerario.getAsientos()) {
				Assert.assertEquals(asiento.getUbicacion(), Ubicacion.Pasillo);
			}
		}
	}
}
